package br.com.toscano.contpedido.view;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;

import br.com.toscano.contpedido.business.ClienteBC;
import br.com.toscano.contpedido.business.RecebimentoBC;
import br.com.toscano.contpedido.business.UsuarioBC;
import br.com.toscano.contpedido.constant.ConstantesMensagem;
import br.com.toscano.contpedido.domain.Cliente;
import br.com.toscano.contpedido.domain.ContextoUsuario;
import br.com.toscano.contpedido.domain.Perfil;
import br.com.toscano.contpedido.domain.Recebimento;
import br.com.toscano.contpedido.domain.Usuario;
import br.com.toscano.contpedido.view.converter.DateConverter;
import br.gov.frameworkdemoiselle.annotation.NextView;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractListPageBean;
import br.gov.frameworkdemoiselle.util.ResourceBundle;

@ViewController
@NextView("./recebimento_edit.jsf")
@PreviousView("./recebimento_list.jsf")
public class RecebimentoListMB extends AbstractListPageBean<Recebimento, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private RecebimentoBC recebimentoBC;
	
	private Date dataRecebimentoInicial = new Date();
	private Date dataRecebimentoFinal = new Date();
	
	private Boolean conferido;
	private Long idRecebimento;
	
	public Long getIdRecebimento() {
		return idRecebimento;
	}

	public void setIdRecebimento(Long idRecebimento) {
		this.idRecebimento = idRecebimento;
	}

	public Boolean getConferido() {
		return conferido;
	}

	public void setConferido(Boolean conferido) {
		this.conferido = conferido;
	}

	public RecebimentoBC getRecebimentoBC() {
		return recebimentoBC;
	}

	public void setRecebimentoBC(RecebimentoBC recebimentoBC) {
		this.recebimentoBC = recebimentoBC;
	}

	public Date getDataRecebimentoInicial() {
		return dataRecebimentoInicial;
	}

	public void setDataRecebimentoInicial(Date dataRecebimentoInicial) {
		this.dataRecebimentoInicial = dataRecebimentoInicial;
	}

	public Date getDataRecebimentoFinal() {
		return dataRecebimentoFinal;
	}

	public void setDataRecebimentoFinal(Date dataRecebimentoFinal) {
		this.dataRecebimentoFinal = dataRecebimentoFinal;
	}


	@Inject
	private UsuarioBC usuarioBC;
	private List<SelectItem> usuarios;
	private Long usuario;

	public List<SelectItem> getUsuarios() {
		usuarios = new ArrayList<SelectItem>();
		boolean admin = false;
		ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
		if (usuario != null) {
			for (Perfil perfil :usuario.getUsuario().getListaPerfil()) {
				if (perfil.getId().equals(Perfil.PERFIL_ADM)){
					admin = true;
				}
			}
		}
		if (admin) {
			List<Usuario> lista = usuarioBC.findAll();
			for (Usuario obj: lista) {
				usuarios.add(new SelectItem(obj.getId() , obj.getNome()));
			}
		} else {
			usuarios.add(new SelectItem(usuario.getUsuario().getId() , usuario.getUsuario().getNome()));
		}
		return usuarios;
	}

	public void setUsuarios(List<SelectItem> usuarios) {
		this.usuarios = usuarios;
	}

	public Long getUsuario() {
		return usuario;
	}

	public void setUsuario(Long usuario) {
		this.usuario = usuario;
	}


	@Inject
	private ClienteBC clienteBC;
	private List<SelectItem> clientes;
	private Long cliente;


	public List<SelectItem> getClientes() {
		clientes = new ArrayList<SelectItem>();
		List<Cliente> lista = clienteBC.findAll();
		for (Cliente obj: lista) {
			clientes.add(new SelectItem(obj.getId() , obj.getNome()));
		}
		return clientes;
	}

	public void setClientes(List<SelectItem> clientes) {
		this.clientes = clientes;
	}

	public Long getCliente() {
		return cliente;
	}

	public void setCliente(Long cliente) {
		this.cliente = cliente;
	}

	@Override
	protected List<Recebimento> handleResultList() {

		this.setCliente(null);
		setDataRecebimentoInicial(null);
		setDataRecebimentoFinal(null);
		
		boolean admin = false;
		ContextoUsuario usuario = (ContextoUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ConstantesMensagem.CONTEXTO_USUARIO_SESSAO);
		if (usuario != null) {
			for (Perfil perfil :usuario.getUsuario().getListaPerfil()) {
				if (perfil.getId().equals(Perfil.PERFIL_ADM)){
					admin = true;
				}
			}
			
		}
		
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();    

		if (!admin) {
			this.setUsuario(usuario.getUsuario().getId());
		} else {
			if (request.getParameter("usuario") != null && !"".equals(request.getParameter("usuario")))
				this.setUsuario(new Long(request.getParameter("usuario")));
		}
		
		if (request.getParameter("cliente") != null && !"".equals(request.getParameter("cliente")))	
			this.setCliente(new Long(request.getParameter("cliente")));
		
		if (request.getParameter("dataRecebimentoInicial_input") != null && !"".equals(request.getParameter("dataRecebimentoInicial_input")))	{
			setDataRecebimentoInicial(DateConverter.getDate(request.getParameter("dataRecebimentoInicial_input")));
		}

		if (request.getParameter("dataRecebimentoFinal_input") != null && !"".equals(request.getParameter("dataRecebimentoFinal_input")))	{
			setDataRecebimentoFinal(DateConverter.getDate(request.getParameter("dataRecebimentoFinal_input")));
		}

		List<Recebimento> recebimentos = recebimentoBC.consultarRecebimento(this.getCliente(), this.getUsuario(), this.getDataRecebimentoInicial(), this.getDataRecebimentoFinal(), conferido);

		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("recebimentos", recebimentos);

		return recebimentos;
	}
	
	public void filtrar() {
		super.clear();
		super.getDataModel();
	}

	@Inject
	private FacesContext facesContext;
	
	@Inject
	private ResourceBundle bundle;

	public String deleteSelection() {
		boolean delete;
		
		List<Long> ids = new ArrayList<Long>();
		for (Iterator<Long> iter = getSelection().keySet().iterator(); iter.hasNext();) {
			Long id = iter.next();
			delete = getSelection().get(id);
			if (delete) {
				ids.add(id);
				iter.remove();
			}
		}
		
		try {
			recebimentoBC.delete(ids);
		} catch (Exception e) {
			facesContext.addMessage(null, new FacesMessage(bundle.getString(ConstantesMensagem.ERRO_REMOVER)));
		}				

		return getPreviousView();
	}

	
	public void postProcessXLS(Object document) {
		

//		org.apache.poi.hssf.usermodel.HSSFWorkbook a;
//		org.apache.poi.ss.usermodel.Workbook b;
		
		HSSFWorkbook wb = (HSSFWorkbook) document;
		HSSFSheet sheet = wb.getSheetAt(0);
		
		/******************** HEADER **********************/		
		CellStyle headerStyle = wb.createCellStyle();
		Font headerFont = wb.createFont();
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headerFont.setColor(HSSFColor.BLUE.index);
		headerStyle.setFont(headerFont);
		headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
		 
		Row headerRow = sheet.getRow(0);
		int cont = 0; 
		for (Cell cell : headerRow) {
			cell.setCellStyle(headerStyle);
			if (0 == cont) {
				cell.setCellValue("");
			} else if (cont ==1) {
				cell.setCellValue("");
			} else if (cont ==2) {
				cell.setCellValue("Nº Recebimento");
			} else if (cont ==3) {
				cell.setCellValue("Cliente");
			} else if (cont ==4) {
				cell.setCellValue("Usuário");
			} else if (cont ==5) {
				cell.setCellValue("Data Recebimento");
			} else if (cont ==6) {
				cell.setCellValue("Forma Recebimento");
			} else if (cont ==7) {
				cell.setCellValue("Valor Recebimento");
			} else if (cont ==8) {
				cell.setCellValue("Conferido");
			}
			cont++;
		}
		
		/******************** TOTAL **********************/
		CellStyle style = wb.createCellStyle();
		Font font = wb.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
//		font.setColor(HSSFColor.ORANGE.index); 
		style.setFont(font);
		style.setAlignment(CellStyle.ALIGN_RIGHT);
		Row totalRow = sheet.createRow(sheet.getLastRowNum()+2);
		Cell cell1 = totalRow.createCell(6);
		cell1.setCellValue("Total");
		cell1.setCellStyle(style);
		Cell cell2 = totalRow.createCell(7);
		
		BigDecimal valor = BigDecimal.ZERO;
		List<Recebimento> pedidos = this.getResultList();
		for (Recebimento pedido : pedidos) {
			valor = valor.add(pedido.getValorTotalRecebimento());
		}
		
		cell2.setCellFormula(valor.toString());
		
		cell2.setCellStyle(style);

		//Ajuste do tamanho das colunas
		sheet.autoSizeColumn(0);
		sheet.autoSizeColumn(1);
		sheet.autoSizeColumn(2);
		sheet.autoSizeColumn(3);
		sheet.autoSizeColumn(4);
		sheet.autoSizeColumn(5);
		sheet.autoSizeColumn(6);
		sheet.autoSizeColumn(7);
		sheet.autoSizeColumn(8);
	}
	
	public void carregarPedido() {
		if (this.getIdRecebimento() != null)  {
			Recebimento recebimento = recebimentoBC.load(this.getIdRecebimento());
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("recebimento", recebimento);
		}
	}


}